/** 
 * Klasse Hoerbuch erbt von Datentraeger. Stelle die Varialben fuer die
 * Daten des Hoerbuch bereit.
 * 
 * Alle Methoden mit setze...() weisen einer Variablen einen Wert zu.
 * Alle gib...() Methoden liefern den Wert der jeweiligen Variablen
 * zurueck. Alle ...Hinzufuegen Methoden fuegen einen Wert einer Liste 
 * hinzu.
 * 
 * Datei: Hoerbuch.java         	Autor: Simon Schindelmann 
 * Datum: 06.11.11                 	Version: 0.3
 * 
 * Historie: 
 * 06.11.11:  v0.1    Klasse wurde angelegt.
 * 15.12.11   v0.2    gibAutorenListeString () Methode angelegt um die
 *                    Namen der Autoren als String zurueck zugeben.
 * 25.12.11:  v0.3    ISBN Methode geaendert. Prueft nun ob die selbe
 *                    ISBN schon vorhanden ist.
 * 
 */

package medienverwaltung;

import basis.idnr.ISBN;
import java.util.*;
import medienverwaltung.simulation.Uebersetzung;
import personenverwaltung.Person;


public class Hoerbuch extends Datentraeger 
{
  private static final long serialVersionUID = -4049472442814303592L;
  //Speichert die aktuelle Sprache die verwendet wird.
  private Uebersetzung uebersetzung = Uebersetzung.gibSprache ();
  private ISBN isbn13;
  private ArrayList<Person> autorenListe = new ArrayList<Person> ();
  private ArrayList<Person> sprecherListe = new ArrayList<Person> ();


  public Hoerbuch (String titel, String datum, Abmessung abmessung,
      Datentraegertyp typ, String isbn13) throws KeinDatumFormat, 
      VergebeneISBNAusnahme
  {
    super (titel, datum, abmessung, typ); 
    setzeISBN (isbn13, gibMediumId ());
    initial = "HB";
  }

  public Hoerbuch (String titel, String datum, Abmessung abmessung,
      String verlag, String ausgabe, Datentraegertyp typ,
      String version, String isbn13, String autoren)
      throws NameEnthaeltZahlenSonderzeichen, KeinDatumFormat, 
      VergebeneISBNAusnahme
  {
    super (titel, datum, abmessung, verlag, ausgabe, typ, version);
    setzeISBN (isbn13, gibMediumId ());
    autorenSetzen (autoren);
    initial = "HB";
  }

  
  /**
   * Fuegt die Autoren  des Hoerbuchs hinzu.
   * @param autoren Namen der Autoren.
   * @throws NameEnthaeltZahlenSonderzeichen
   */
  public void autorenHinzufuegen (String autoren)
      throws NameEnthaeltZahlenSonderzeichen
  {
    autorenListe.clear ();
    autorenSetzen (autoren);
  }


  /**
   * Der String mit den Autoren wird hier uebergeben. Der String wird
   * von einer Namenparser-Methode zerteilt und eine ArrayList wird
   * zurueck geliefert. Die Enthaelt pro Namen ein Array. Das Array
   * enthaelt jeden Teilnamen des kompletten Namens. Dann werden die
   * namen in den Arrays bis zur vorletzten Stelle im String vorname
   * gespeichert und der letzte Arraywert ist der Nachname der wird im
   * String nachname gespeichert. Aus den beiden Strings kann dann ein
   * Objekt Person erzeugt werden und der autorListe hinzugefuegt
   * werden.
   * 
   * @param autoren Hier wird ein String mit Autorennamen uebergeben.
   * @NameEnthealtZahlen
   */
  private void autorenSetzen (String autoren) 
  	throws NameEnthaeltZahlenSonderzeichen
  {
    ArrayList<String[]> temp = new ArrayList<String[]> ();
    // ArrayList enthaelt die Namen der Autoren
    temp = NamenParser.parsen (autoren);
    // Speichert den Array mit dem Autoren Namen
    String[] buffer;
    for (int i = 0; i < temp.size (); i++)
    {
      buffer = temp.get (i);
      String vorname = "";
      String nachname = "";

      for (int j = 0; j < buffer.length; j++)
      {
        /*
         * Prueft ob es der vorletzte Arraywert ist falls ja wird 
         * dannach in den else Teil gegangen und der Nachname wird 
         * gespeichert.
         */
        if (j < (buffer.length - 1))
        {
          vorname = "" + buffer[j];
        }
        else
        {
          nachname = "" + buffer[j];
        }
      }
      Person p = new Person (vorname, nachname);
      autorenListe.add (p);
    }
  }


  /**
   * Fuegt die Sprecher des Hoerbuchs hinzu.
   * @param sprecher
   * @throws NameEnthaeltZahlenSonderzeichen
   */
  public void sprecherHinzufuegen (String sprecher)
      throws NameEnthaeltZahlenSonderzeichen
  {
    sprecherListe.clear ();
    sprecherSetzen (sprecher);
  }


  /**
   * Gibt die ISBN des Hoerbuchs zurueck.
   * @return
   */
  public ISBN gibIsbn13 ()
  {
    return isbn13;
  }

  
  /**
   * Gibt die Autoren des Hoerbuchs zurueck.
   * @return Arrayliste mit den Autoren.
   */
  public ArrayList<Person> gibAutorListe ()
  {
    return autorenListe;
  }
  
  
  /**
   * Liefert den Inhalt der Autorenliste als String zurueck.
   * @return String mit den Autorennamen des Hoerbuchs.
   */
  public String gibAutorenListeString ()
  {
    String autoren = "";
    for (int i = 0; i < autorenListe.size (); i++)
    {
      Person b = autorenListe.get (i);
      if (i < (autorenListe.size () - 1))
      {
        autoren = autoren + "" + b.gibVornamen () + " "
            + b.gibNachname () + ", ";
      }
      else
      {
        autoren = autoren + "" + b.gibVornamen () + " "
            + b.gibNachname ();
      }
    }
    return autoren;
  }
  
  
  /**
   * Gibt die Sprecher des Hoerbuchs zurueck.
   * @return Arrayliste mit den Sprechern.
   */
  public ArrayList<Person> gibSprecherListe ()
  {
    return sprecherListe;
  }
  
  
  /**
   * Liefert den Inhalt der Sprecherliste als String zurueck.
   * @return String mit den Sprechernamen des Hoerbuchs.
   */
  public String gibSprecherListeString ()
  {
    String sprecher = "";
    for (int i = 0; i < sprecherListe.size (); i++)
    {
      Person b = sprecherListe.get (i);
      if (i < (sprecherListe.size () - 1))
      {
        sprecher = sprecher + "" + b.gibVornamen () + " "
            + b.gibNachname () + ", ";
      }
      else
      {
        sprecher = sprecher + "" + b.gibVornamen () + " "
            + b.gibNachname ();
      }
    }
    return sprecher;
  }


  /**
   * Der String mit den Sprechern wird hier uebergeben. Der String wird
   * von einer Namenparser-Methode zerlegt und eine ArrayList wird
   * zurueck geliefert. Die Enthaelt pro Namen ein Array. Das Array
   * enthaelt jeden Teilnamen des kompletten Namens. Dann werden die
   * namen in den Arrays bis zur vorletzten Stelle im String vorname
   * gespeichert und der letzte Arraywert ist der Nachname der wird im
   * String nachname gespeichert. Aus den beiden Strings kann dann ein
   * Objekt Person erzeugt werden und der sprecherListe hinzugefuegt
   * werden.
   * 
   * @param Sprecher hier wird ein String mit Sprechernamen uebergeben.
   */
  private void sprecherSetzen (String sprecher)
      throws NameEnthaeltZahlenSonderzeichen
  {
    ArrayList<String[]> temp = new ArrayList<String[]> ();
    // ArrayList enthaelt die Namen der Autoren
    temp = NamenParser.parsen (sprecher);
    // ArrayList enthaelt die Namen der Autoren
    String[] buffer;
    Person p;

    for (int i = 0; i < temp.size (); i++)
    {
      buffer = temp.get (i);
      String vorname = "";
      String nachname = "";

      for (int j = 0; j < buffer.length; j++)
      {
        /*
         * Prueft ob es der vorletzte Arraywert ist falls ja wird 
         * dannach in den else Teil gegangen und der Nachname wird 
         * gespeichert.
         */
        if (j < (buffer.length - 1))
        {
          vorname = "" + buffer[j];
        }
        else
        {
          nachname = "" + buffer[j];
        }
      }
      p = new Person (vorname, nachname);
      sprecherListe.add (p);
    }
  }
  
  
  /**
   * Hier wird die ISBN des Hoerbuchs gesetzt.
   * @param isbn String der die ISBN enthaelt die gesetzt werden soll.
   * @param id ID des Hoerbuchs um zu vermeiden, dass bei der Pruefung 
   * ob es diese ISBN schon gibt, bei dem Hoerbuch der die ISBN setzen 
   * will eine Ausnahme geworfen wird.
   * @throws VergebeneISBNAusnahme wird geworfen wenn ein anderes Medium
   * diese ISBN schon besitzt.
   */
  public void setzeISBN (String isbn, int id)
      throws VergebeneISBNAusnahme
  {
    ISBN tmp = new ISBN (isbn);
    Mediumverwalter mv = new Mediumverwalter ();
    // Wird auf true gesetzt wenn ein Medium die gleiche ISBN hat.
    boolean vorhanden = false;
    // Im Medium mu wird das Medium gespeichert was die selbe ISBN hat.
    Medium mu = null;
    for (Medium m : mv.gibMedienListe ())
    {
      if (m.gibInitial ().equals ("EB"))
      {
        Ebook e = (Ebook) m;
        if (e.gibISBN ().toString ().equals (tmp.toString ())
            && e.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
      if (m.gibInitial ().equals ("BU"))
      {
        Buch b = (Buch) m;
        if (b.gibISBN ().toString ().equals (tmp.toString ())
            && b.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
      if (m.gibInitial ().equals ("HB"))
      {
        Hoerbuch h = (Hoerbuch) m;
        if (h.gibIsbn13 ().toString ().equals (tmp.toString ())
            && h.gibMediumId () != id)
        {
          vorhanden = true;
          mu = m;
        }
      }
    }
    
    /*
     * Wenn kein Medium gefunden wurde, das die selbe ISBN hat wird die
     * ISBN gesetzt. Andernfalls wird eine VergebeneISBNAusnahme 
     * geworfen. Die den Fehler Text enthaelt und die Nr des Mediums das
     * diese ISBN schon hat.
     */
    if (vorhanden == false)
    {
      isbn13 = tmp;
    }
    else
    {
      uebersetzung = Uebersetzung.gibSprache ();
      throw new VergebeneISBNAusnahme (uebersetzung.lokal
          .gibUebersetzung ("Diese ISBN besitzt schon dieses Medium")
          + ":" + "\n"
          + uebersetzung.lokal.gibUebersetzung ("MediumNr") + ": " 
          + mu.gibMediumId ());
    }
  }
}
